/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package practica2_minimax;

/**
 *
 * @author William
 */
public class nodoTablero {

    int[] tablero;
    int turno;
    nodoTablero[] hijos;
    private int e;
    public nodoTablero(int[] pTablero, int turno)
    {
        tablero = pTablero;
        this.turno = turno;
        e = funcionEvaluacion(1) - funcionEvaluacion(0);
    }

    public void calcularE()
    {
        e = funcionEvaluacion(1) - funcionEvaluacion(0);
    }
    public nodoTablero()
    {
        hijos = null;
    }

    public void setTablero(int [] pTablero)
    {
        tablero = pTablero;
    }

    public int getEvaluacion()
    {
        calcularE();
        return e;
    }

    public int getCasilla(int pos)
    {
        return tablero[pos];
    }

    public nodoTablero[] getHijos()
    {
        return hijos;
    }

    public void generarHijos()
    {
        int cantMov = 0;
        for(int i = 0; i < 9; i++)
        {
            if(tablero[i] == -1)
                cantMov++;
        }
        if(cantMov != 0)
        {
            hijos = new nodoTablero[cantMov];
        }
        int inicio = 0;
        for(int j = 0; j < cantMov; j++)
        {
            if(turno == 0)
                hijos[j] = new nodoTablero(tablero.clone(), 1);
            else if(turno == 1)
                hijos[j] = new nodoTablero(tablero.clone(), 0);
            nodoTablero tmp = hijos[j];
            for(int k = inicio; k < 9; k++)
            {
                if(tmp.tablero[k] == -1)
                {
                    inicio = k + 1;
                    tmp.tablero[k] = tmp.turno;
                    tmp.calcularE();
                    break;
                }
            }
        }
    }

    public int funcionEvaluacion(int ficha)
    {
        int val = 0;

        //verificacion horizontal
        if((tablero[0] == ficha || tablero[0] == -1) && (tablero[1] == ficha || tablero[1] == -1) && (tablero[2] == ficha || tablero[2] == -1))
            val++;
        if((tablero[3] == ficha || tablero[3] == -1) && (tablero[4] == ficha || tablero[4] == -1) && (tablero[5] == ficha || tablero[5] == -1))
            val++;
        if((tablero[6] == ficha || tablero[6] == -1) && (tablero[7] == ficha || tablero[7] == -1) && (tablero[8] == ficha || tablero[8] == -1))
            val++;
        //verificacion vertical
        if((tablero[0] == ficha || tablero[0] == -1) && (tablero[3] == ficha || tablero[3] == -1) && (tablero[6] == ficha || tablero[6] == -1))
            val++;
        if((tablero[1] == ficha || tablero[1] == -1) && (tablero[4] == ficha || tablero[4] == -1) && (tablero[7] == ficha || tablero[7] == -1))
            val++;
        if((tablero[2] == ficha || tablero[2] == -1) && (tablero[5] == ficha || tablero[5] == -1) && (tablero[8] == ficha || tablero[8] == -1))
            val++;
        //verificacion diagonal
        if((tablero[0] == ficha || tablero[0] == -1) && (tablero[4] == ficha || tablero[4] == -1) && (tablero[8] == ficha || tablero[8] == -1))
            val++;
        if((tablero[2] == ficha || tablero[2] == -1) && (tablero[4] == ficha || tablero[4] == -1) && (tablero[6] == ficha || tablero[6] == -1))
            val++;

        return val;
    }
}
